package com.ityun.ogapp.utils

import android.content.Context
import android.content.Intent
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.wifi.WifiManager
import android.os.Build
import android.provider.Settings
import android.telephony.TelephonyManager
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

object NetworkUtils {


    /**
     * 定时检查网络是否可用(使用协程避免主线程阻塞)
     * @param context 上下文对象
     * @param interval 检查间隔(毫秒), 默认5000ms
     * @return 返回Flow<Boolean>用于观察网络状态变化
     */
    fun monitorNetworkAvailability(
        context: Context,
        interval: Long = 5000L
    ): Flow<Boolean> = flow {
        while (true) {
            val isAvailable = isNetworkAvailable(context)
            emit(isAvailable)
            delay(interval)
        }
    }.flowOn(Dispatchers.IO) // 在IO线程中执行网络检查操作

    /**
     * 判断当前网络是否可用
     * @param context 上下文对象
     * @return 网络是否可用
     */
    private fun isNetworkAvailable(context: Context): Boolean {
        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val network = connectivityManager.activeNetwork
            val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
            networkCapabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true &&
                    networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) == true
        } else {
            @Suppress("DEPRECATION")
            val networkInfo = connectivityManager.activeNetworkInfo
            networkInfo?.isConnected == true
        }
    }

    /**
     * 判断当前是否是飞行模式
     * @param context 上下文对象
     * @return 是否为飞行模式
     */
    fun isAirplaneModeOn(context: Context): Boolean {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            Settings.Global.getInt(context.contentResolver, Settings.Global.AIRPLANE_MODE_ON, 0) != 0
        } else {
            Settings.System.getInt(context.contentResolver, Settings.System.AIRPLANE_MODE_ON, 0) != 0
        }
    }

    /**
     * 判断WiFi是否打开
     * @param context 上下文对象
     * @return WiFi是否打开
     */
    fun isWifiEnabled(context: Context): Boolean {
        val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        return wifiManager.isWifiEnabled
    }

    /**
     * 判断移动数据是否打开
     * @param context 上下文对象
     * @return 移动数据是否打开
     */
    @Suppress("DEPRECATION")
    fun isMobileDataEnabled(context: Context): Boolean {
        return try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                when (telephonyManager.dataState) {
                    TelephonyManager.DATA_CONNECTED -> true
                    else -> false
                }
            } else {
                val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    val network = connectivityManager.activeNetwork
                    val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
                    networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true
                } else {
                    val networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                    networkInfo?.isConnectedOrConnecting == true
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
            false
        }
    }

    /**
     * 打开WiFi
     * 注意：从Android 10开始，应用无法直接开启WiFi，需要引导用户到系统设置页面
     * @param context 上下文对象
     * @return 是否成功调用开启WiFi的方法（Android 10以下）或是否跳转到设置页面（Android 10及以上）
     */
    fun openWifi(context: Context): Boolean {
        return try {
            val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                // Android 10及以上版本，引导用户到WiFi设置页面
                val intent = android.net.wifi.WifiManager.ACTION_PICK_WIFI_NETWORK
                val wifiIntent = android.content.Intent(intent)
                context.startActivity(wifiIntent)
                true
            } else {
                wifiManager.isWifiEnabled || wifiManager.setWifiEnabled(true)
            }
        } catch (e: Exception) {
            e.printStackTrace()
            false
        }
    }

    /**
     * 打开移动数据
     * 注意：从Android 5.0开始，应用无法直接开启移动数据，需要引导用户到系统设置页面
     * @param context 上下文对象
     * @return 是否成功调用开启移动数据的方法（Android 5.0以下）或是否跳转到设置页面（Android 5.0及以上）
     */
    fun openMobileData(context: Context): Boolean {
        return try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                // Android 5.0及以上版本，引导用户到数据使用设置页面
                val intent = android.content.Intent(Settings.ACTION_DATA_USAGE_SETTINGS)
                context.startActivity(intent)
                true
            } else {
                // Android 5.0以下版本，通过反射尝试开启移动数据（可能不生效）
                val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

                // 使用反射调用setMobileDataEnabled方法
                val method = telephonyManager.javaClass.getDeclaredMethod("setDataEnabled", Boolean::class.java)
                method.isAccessible = true
                method.invoke(telephonyManager, true)
                true
            }
        } catch (e: Exception) {
            e.printStackTrace()
            false
        }
    }

    /**
     * 关闭飞行模式
     * 注意：从Android 4.2开始，应用无法直接关闭飞行模式，需要引导用户到系统设置页面
     * @param context 上下文对象
     * @return 是否成功调用关闭飞行模式的方法（Android 4.2以下）或是否跳转到设置页面（Android 4.2及以上）
     */
    fun closeAirplaneMode(context: Context): Boolean {
        return try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                // Android 4.2及以上版本，引导用户到飞行模式设置页面
                val intent = android.content.Intent(Settings.ACTION_WIRELESS_SETTINGS)
                context.startActivity(intent)
                true
            } else {
                // Android 4.2以下版本，尝试直接关闭飞行模式
                Settings.System.putInt(
                    context.contentResolver,
                    Settings.System.AIRPLANE_MODE_ON,
                    0
                )

                // 发送飞行模式改变广播
                val intent = android.content.Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)
                intent.putExtra("state", false)
                context.sendBroadcast(intent)
                true
            }
        } catch (e: Exception) {
            e.printStackTrace()
            false
        }
    }

}